Comparing Structures and Classes
Structures and classes in Swift have many things in common. Both can:
- Define properties to store values
- Define methods to provide functionality
- Define subscripts to provide access to their values using subscript syntax
- Define initializers to set up their initial state
- Be extended to expand their functionality beyond a default implementation
- Conform to protocols to provide standard functionality of a certain kind
Classes have additional capabilities:
- Inheritance enables one class to inherit the characteristics of another.
- Type casting enables you to check and interpret the type of a class instance at runtime.
- Deinitializers enable an instance of a class to free up any resources it has assigned.
- Reference counting allows more than one reference to a class instance.
Copy by:
Structures and Enumerations Are Value Types
Classes Are Reference Types
Classes和Structures之間的選擇
Classes和Structures都可以用來自定需要的資料結構。
總之,Structures實例總是通過Value Types來傳遞,而類別是通過Reference來傳遞。這意味著他們分別適用於不同類型的任務。當你考慮你程式中資料結構和功能的時候,你需要決定把個別資料結構定義成Classes還是Structures。
當符合以下一條或多條情形時應考慮創建一個Struct而不是Class:
- 主要目的是為了封裝一些相關的簡單資料
- 需要封裝的資料是使用 Value Type 而不是 Reference Type
- 不需要從一個已存在類別繼承屬性或者方法
- struct 的使用定位比較像是儲存資料。
- class則是著重在流程控制,程式功能導向。
為何 apple 要創建 struct :
- Struct 無法繼承
- 因為傳統繼承關係太過笨重且不靈活,蘋果為解決此問題使用了Protocols的概念,大幅的改進了繼承的缺點。
- Struct 擁有成員建構子 (Memberwise Initializer)
- Swift除了安全、快速、易讀性之外還有簡單、現代化的特性,此處的成員建構子就是個很典型的例子。Struct 在你呼叫時就會給你成員建構子讓你填入外部參數達到初始化。
- Struct 是 Value Type , Class 是 Reference Type
- 如我上面所講述,為了安全的緣故,蘋果大力的提倡身為 Value Type 的 Struct 以防值不正常覆蓋。
-
Struct 不能直接修改內部屬性,如果要修改必須加上 mutating
-
安全、安全 還是安全
-
struct 是 Copy-on-write,所以只有在修改 struct 的值時才會被複製一份。